#!/bin/bash
#
# This file is part of util-linux.
#
# This file is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This file is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
#
# Create partition in non-interactive mode; like mkpart, but partition is fully
# specifuied by partno, start and size.
#

TS_TOPDIR="${0%/*}/../.."
TS_DESC="mkpart-full"

. "$TS_TOPDIR"/functions.sh
ts_init "$*"

TESTPROG="$TS_HELPER_LIBFDISK_MKPART_FULLSPEC"
ts_check_test_command "$TESTPROG"
ts_check_test_command "$TS_CMD_SFDISK"
ts_check_test_command "$TS_CMD_WIPEFS"

TEST_IMAGE_NAME=$(ts_image_init 15)

ts_init_subtest "mbr-primary"
ts_run $TESTPROG --label mbr --device ${TEST_IMAGE_NAME} \
	1,2048,2048 \
	2,4096,2048 \
	3,6144,2048 \
	4,8192,22528 \
	>> $TS_OUTPUT 2>> $TS_ERRLOG
$TS_CMD_SFDISK --list ${TEST_IMAGE_NAME} >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_fdisk_clean ${TEST_IMAGE_NAME}
ts_finalize_subtest

$TS_CMD_WIPEFS --all --force ${TEST_IMAGE_NAME} &> /dev/null


ts_init_subtest "mbr-primary-nopartno"
ts_run $TESTPROG --label mbr --device ${TEST_IMAGE_NAME} -- \
	-,2048,2048 \
	-,4096,2048 \
	-,6144,2048 \
	-,8192,22528 \
	>> $TS_OUTPUT 2>> $TS_ERRLOG
$TS_CMD_SFDISK --list ${TEST_IMAGE_NAME} >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_fdisk_clean ${TEST_IMAGE_NAME}
ts_finalize_subtest

$TS_CMD_WIPEFS --all --force ${TEST_IMAGE_NAME} &> /dev/null

## no extended but partno > 4 requested
ts_init_subtest "mbr-err-primary"
ts_run $TESTPROG --label mbr --device ${TEST_IMAGE_NAME} \
	1,2048,2048 \
	2,4096,2048 \
	7,6144,2048 \
	>> $TS_OUTPUT 2>> $TS_ERRLOG
$TS_CMD_SFDISK --list ${TEST_IMAGE_NAME} >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_fdisk_clean ${TEST_IMAGE_NAME}
ts_finalize_subtest

$TS_CMD_WIPEFS --all --force ${TEST_IMAGE_NAME} &> /dev/null

## no extended but partno > 4 requested
ts_init_subtest "mbr-err-nospace"
ts_run $TESTPROG --label mbr --device ${TEST_IMAGE_NAME} \
	1,2048,2048 \
	2,4096,2048 \
	3,4096,2048 \
	>> $TS_OUTPUT 2>> $TS_ERRLOG
$TS_CMD_SFDISK --list ${TEST_IMAGE_NAME} >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_fdisk_clean ${TEST_IMAGE_NAME}
ts_finalize_subtest

$TS_CMD_WIPEFS --all --force ${TEST_IMAGE_NAME} &> /dev/null


ts_init_subtest "mbr-logical"
ts_run $TESTPROG --label mbr --device ${TEST_IMAGE_NAME} \
	1,2048,2048 \
	2,4096,2048 \
	3,6144,2048 \
	4,8192,22528 \
	5,10240,2048 \
	6,14336,2048 \
	7,18432,12288 \
       	>> $TS_OUTPUT 2>> $TS_ERRLOG
$TS_CMD_SFDISK --list ${TEST_IMAGE_NAME} >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_fdisk_clean ${TEST_IMAGE_NAME}
ts_finalize_subtest

$TS_CMD_WIPEFS --all --force ${TEST_IMAGE_NAME} &> /dev/null

ts_init_subtest "mbr-nopartno"
ts_run $TESTPROG --label mbr --device ${TEST_IMAGE_NAME} -- \
	-,2048,2048 \
	-,4096,2048 \
	-,6144,2048 \
	-,8192,22528 \
	-,10240,2048 \
	-,14336,2048 \
	-,18432,12288 \
       	>> $TS_OUTPUT 2>> $TS_ERRLOG
$TS_CMD_SFDISK --list ${TEST_IMAGE_NAME} >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_fdisk_clean ${TEST_IMAGE_NAME}
ts_finalize_subtest

$TS_CMD_WIPEFS --all --force ${TEST_IMAGE_NAME} &> /dev/null

### 6th partition (logical) out of extended
ts_init_subtest "mbr-err-logical"
ts_run $TESTPROG --label mbr --device ${TEST_IMAGE_NAME} \
	1,2048,2048 \
	2,4096,2048 \
	3,6144,2048 \
	4,8192,22528 \
	5,10240,2048 \
	6,4096,2048 \
	7,18432,12288 \
       	>> $TS_OUTPUT 2>> $TS_ERRLOG
$TS_CMD_SFDISK --list ${TEST_IMAGE_NAME} >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_fdisk_clean ${TEST_IMAGE_NAME}
ts_finalize_subtest

$TS_CMD_WIPEFS --all --force ${TEST_IMAGE_NAME} &> /dev/null

ts_init_subtest "mbr-space-gap"
ts_run $TESTPROG --label mbr --device ${TEST_IMAGE_NAME} \
	1,2048,2048 \
	2,6144,2048 \
	3,8192,2048 \
	>> $TS_OUTPUT 2>> $TS_ERRLOG
$TS_CMD_SFDISK --list ${TEST_IMAGE_NAME} >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_fdisk_clean ${TEST_IMAGE_NAME}
ts_finalize_subtest

$TS_CMD_WIPEFS --all --force ${TEST_IMAGE_NAME} &> /dev/null

ts_init_subtest "gpt"
ts_run $TESTPROG --label gpt --device ${TEST_IMAGE_NAME} \
	1,2048,2048 \
	2,4096,2048 \
	3,6144,2048 \
	4,8192,2048 \
	5,10240,2048 \
	6,12288,2048 \
	7,14336,2048 \
       	>> $TS_OUTPUT 2>> $TS_ERRLOG
$TS_CMD_SFDISK --list ${TEST_IMAGE_NAME} >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_fdisk_clean ${TEST_IMAGE_NAME}
ts_finalize_subtest

$TS_CMD_WIPEFS --all --force ${TEST_IMAGE_NAME} &> /dev/null

ts_init_subtest "gpt-nopartno"
ts_run $TESTPROG --label gpt --device ${TEST_IMAGE_NAME} -- \
	-,2048,2048 \
	-,4096,2048 \
	-,6144,2048 \
	-,8192,2048 \
	-,10240,2048 \
	-,12288,2048 \
	-,14336,2048 \
       	>> $TS_OUTPUT 2>> $TS_ERRLOG
$TS_CMD_SFDISK --list ${TEST_IMAGE_NAME} >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_fdisk_clean ${TEST_IMAGE_NAME}
ts_finalize_subtest

$TS_CMD_WIPEFS --all --force ${TEST_IMAGE_NAME} &> /dev/null

### 4th partition overlap 4th and 5th
ts_init_subtest "gpt-err-overlap"
ts_run $TESTPROG --label gpt --device ${TEST_IMAGE_NAME} \
	1,2048,2048 \
	2,4096,2048 \
	3,6144,2048 \
	4,5000,2048 \
	5,10240,2048 \
	6,12288,2048 \
	7,14336,2048 \
       	>> $TS_OUTPUT 2>> $TS_ERRLOG
$TS_CMD_SFDISK --list ${TEST_IMAGE_NAME} >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_fdisk_clean ${TEST_IMAGE_NAME}
ts_finalize_subtest

$TS_CMD_WIPEFS --all --force ${TEST_IMAGE_NAME} &> /dev/null

ts_init_subtest "gpt-partno-gap"
ts_run $TESTPROG --label gpt --device ${TEST_IMAGE_NAME} \
	1,2048,2048 \
	2,4096,2048 \
	4,6144,2048 \
	5,8192,2048 \
	7,10240,2048 \
	8,12288,2048 \
	9,14336,2048 \
       	>> $TS_OUTPUT 2>> $TS_ERRLOG
$TS_CMD_SFDISK --list ${TEST_IMAGE_NAME} >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_fdisk_clean ${TEST_IMAGE_NAME}
ts_finalize_subtest

$TS_CMD_WIPEFS --all --force ${TEST_IMAGE_NAME} &> /dev/null

ts_init_subtest "gpt-space-gap"
ts_run $TESTPROG --label gpt --device ${TEST_IMAGE_NAME} \
	1,2048,2048 \
	2,6144,2048 \
	3,8192,2048 \
	4,12288,2048 \
	5,14336,2048 \
       	>> $TS_OUTPUT 2>> $TS_ERRLOG
$TS_CMD_SFDISK --list ${TEST_IMAGE_NAME} >> $TS_OUTPUT 2>> $TS_ERRLOG
ts_fdisk_clean ${TEST_IMAGE_NAME}
ts_finalize_subtest

ts_finalize
